package com.java.i18n;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

import org.junit.Test;

/**
 * java底层国际化客户端
 * @author LC
 *
 */
public class JavaI18nClient {
	
	/**
	 * Java内置的国际化，以java.util.ResourceBundle和java.util.Locale两个类为中心。
	 * 		其中, java.util.Locale负责选择合适的语言，
	 * 		而java.util.ResourceBundle负责根据注入的java.util.Locale对象来选择国际化信息的来源，返回国际化信息。
	 * 步骤：
	 * 		1、获取指定语言后缀
	 * 		2、绑定指定语言对应的国际化属性文件：参数——前缀+后缀
	 * 		3、引用获取到的属性文件中的信息
	 * 说明：
	 * 		1、Locale类：Locale类里边预置了很多语种，通过该类来获取特定语种的后缀
	 * 				Locale.SIMPLIFIED_CHINESE：static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");
	 * 				Locale.US：static public final Locale US = createConstant("en", "US");
	 * 				Locale.FRANCE：static public final Locale FRANCE = createConstant("fr", "FR");
	 * 		2、ResouceBundler类
	 * 				通过ResouceBundle.getBundle(前缀+后缀)方法匹配指定的国际化属性文件
	 * 				通过bundle2.getString("key键")来获取配置文件中key键对应的value国际化信息
	 * 		3、当指定的国际化属性文件不存在时，将选择默认的国际化信息
	 */
	@Test
	public void javaI18NClient_01() {
		//选择中文:locale1=zh_CN
		//static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");
		Locale locale1 = Locale.SIMPLIFIED_CHINESE ;
		//绑定中文属性文件:bundle1=message_zh_CN.properties
		ResourceBundle bundle1 = ResourceBundle.getBundle("message", locale1) ;
		//取出message_zh_CN.properties中key为labela对应的value值
		System.out.println("bundle1=" + bundle1.getString("labela"));
		
		//选择英文:locale1=en_CN
		//static public final Locale US = createConstant("en", "US");
		Locale locale2 = Locale.US ;
		//绑定英文属性文件:bundle2=message_en_CN.properties
		ResourceBundle bundle2 = ResourceBundle.getBundle("message", locale2) ;
		//取出message_en_CN.properties中key为labela对应的value值
		System.out.println("bundle2=" + bundle2.getString("labela"));
		
		//选择法文:locale1=fr_FR
		//static public final Locale FRANCE = createConstant("fr", "FR");
		Locale locale3 = Locale.FRANCE ;
		//法语国际化属性文件不存在，使用默认语言
		ResourceBundle bundle3 = ResourceBundle.getBundle("message", locale3) ;
		System.out.println("bundle3=" + bundle3.getString("labela"));
	}
	
	/**
	 * 向国际化属性文件中的信息传入参数
	 * 考虑的问题及解决办法：
	 * 		1、在编写国际化信息时，如何给参数留出位置？——使用索引的方式进行占位
	 * 		2、在客户端访问国际化信息时，如何把参数传入预定的位置？——使用MessageFormat类将参数合成进读出的国际化信息中
	 */
	@Test
	public void javaI18NClient_02() {
		
		Locale locale_en = Locale.US ;
		ResourceBundle bundle_en = ResourceBundle.getBundle("message", locale_en) ;
		String key = bundle_en.getString("order_01") ;
		//使用MessageFormat类的format()方法将参数合成进读出的国际化信息中
		String value = MessageFormat.format(key, "2016921102452") ;
		System.out.println(value);
		
		Locale locale_zh = Locale.SIMPLIFIED_CHINESE ;
		ResourceBundle bundle_zh = ResourceBundle.getBundle("message", locale_zh) ;
		String key2 = bundle_zh.getString("order_01") ;
		String value2 = MessageFormat.format(key2, "201692112123") ;
		System.out.println(value2);
	}
	
	/**
	 * 向国际化属性文件中的信息传入多个参数
	 * 		将待传入的多个参数放入到数组中，传入到MessageFormat.format(pattern, arguments)方法中
	 */
	@Test
	public void javaI18NClient_03() {
		
		Locale locale_en = Locale.US ;
		ResourceBundle bundle_en = ResourceBundle.getBundle("message", locale_en) ;
		String value_en = bundle_en.getString("order_02") ;
		System.out.println("参数传入前：" + value_en);
		//将多个参数合成进读出的国际化信息
		String[] params_en = new String[2] ;
		params_en[0] = "Petty" ;
		params_en[1] = "20169211" ;
		String message_en = MessageFormat.format(value_en, params_en) ;
		System.out.println("参数传入后：" + message_en);
		
		Locale locale_zh = Locale.SIMPLIFIED_CHINESE ;
		ResourceBundle bundle_zh = ResourceBundle.getBundle("message", locale_zh) ;
		String value_zh = bundle_zh.getString("order_02") ;
		System.out.println("参数传入前：" + value_zh);
		String[] params_zh = new String[2] ;
		params_zh[0] = "张三" ;
		params_zh[1] = "20169211" ;
		String message_zh = MessageFormat.format(value_zh, params_zh) ;
		System.out.println("参数传入后：" + message_zh);
	}
	

}
